"""
清除景点数据缓存
"""
from django.core.management.base import BaseCommand
from django.core.cache import cache
from django.core.cache.utils import make_key


class Command(BaseCommand):
    help = '清除景点数据缓存'

    def add_arguments(self, parser):
        parser.add_argument(
            '--all',
            action='store_true',
            help='清除所有缓存（包括其他应用的缓存）'
        )

    def handle(self, *args, **options):
        clear_all = options['all']
        
        self.stdout.write(self.style.SUCCESS('=' * 60))
        self.stdout.write(self.style.SUCCESS('开始清除景点数据缓存'))
        self.stdout.write(self.style.SUCCESS('=' * 60))
        
        if clear_all:
            # 清除所有缓存
            cache.clear()
            self.stdout.write(self.style.SUCCESS('✓ 已清除所有缓存'))
        else:
            # 只清除景点相关缓存
            cleared_count = 0
            
            # 清除列表缓存（需要匹配所有可能的查询参数组合）
            # 由于缓存键包含查询参数，我们需要清除所有匹配的键
            # 这里使用通配符匹配（如果缓存后端支持）
            try:
                # 尝试清除所有以 attractions_list_ 开头的缓存
                if hasattr(cache, 'delete_pattern'):
                    cache.delete_pattern('attractions_list_*')
                    cleared_count += 1
                    self.stdout.write(self.style.SUCCESS('✓ 已清除景点列表缓存'))
                else:
                    # 如果不支持模式匹配，清除常见的缓存键
                    common_keys = [
                        'attractions_list_',
                        'attractions_list_page=1',
                        'attractions_list_page=1&page_size=20',
                    ]
                    for key in common_keys:
                        if cache.get(key):
                            cache.delete(key)
                            cleared_count += 1
                    self.stdout.write(self.style.SUCCESS(f'✓ 已清除 {cleared_count} 个列表缓存键'))
            except Exception as e:
                self.stdout.write(self.style.WARNING(f'清除列表缓存时出错: {e}'))
            
            # 清除详情缓存
            try:
                if hasattr(cache, 'delete_pattern'):
                    cache.delete_pattern('attraction_detail_*')
                    cleared_count += 1
                    self.stdout.write(self.style.SUCCESS('✓ 已清除景点详情缓存'))
                else:
                    # 手动清除一些常见的详情缓存键
                    # 注意：这里无法清除所有详情缓存，因为ID是动态的
                    self.stdout.write(self.style.WARNING('缓存后端不支持模式匹配，详情缓存可能需要手动清除'))
            except Exception as e:
                self.stdout.write(self.style.WARNING(f'清除详情缓存时出错: {e}'))
            
            # 清除推荐缓存
            try:
                if hasattr(cache, 'delete_pattern'):
                    cache.delete_pattern('attraction_recommendations_*')
                    cleared_count += 1
                    self.stdout.write(self.style.SUCCESS('✓ 已清除推荐缓存'))
            except Exception as e:
                self.stdout.write(self.style.WARNING(f'清除推荐缓存时出错: {e}'))
        
        self.stdout.write(self.style.SUCCESS('\n' + '=' * 60))
        self.stdout.write(self.style.SUCCESS('缓存清除完成！'))
        self.stdout.write(self.style.SUCCESS('=' * 60))
        self.stdout.write(self.style.INFO('\n提示: 如果数据仍未更新，请刷新浏览器页面'))

